home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
CompVObject.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-26
|
5KB
|
308 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "CompVObject.h"
#include "Class.h"
#include "OrdColl.h"
//---- Iterator1 ---------------------------------------------------------------
class Iterator1 : public Iterator {
Object *op;
int n;
public:
Iterator1(Object *o)
{ op= o; n= 0; }
Object *operator()();
void Reset()
{ n= 0; }
};
Object *Iterator1::operator()()
{
if (n == 0) {
n= 1;
return op;
}
n= 0;
return 0;
}
//---- CompositeVObject --------------------------------------------------------
NewAbstractMetaImpl(CompositeVObject,VObject, (TP(list)));
CompositeVObject::CompositeVObject(int id, SeqCollection *cp) : VObject(id)
{
list= cp;
if (list) {
list->ForEach(VObject,SetContainer)(this);
islist= TRUE;
} else
islist= FALSE;
}
CompositeVObject::CompositeVObject(int va_(id), ...) : VObject(va_(id))
{
va_list ap;
va_start(ap,va_(id));
list= 0;
islist= FALSE;
SetItems(ap);
va_end(ap);
}
CompositeVObject::CompositeVObject(int id, va_list ap) : VObject(id)
{
list= 0;
islist= FALSE;
SetItems(ap);
}
CompositeVObject::~CompositeVObject()
{
if (list) {
if (islist) {
SeqCollection *tmp= list;
list= 0;
islist= FALSE;
tmp->ForEach(VObject,ClearContainer)(this);
tmp->FreeAll();
delete tmp;
} else {
((VObject*)list)->ClearContainer(this);
SafeDelete(list);
}
}
}
VObject *CompositeVObject::At(int n)
{
if (list) {
if (islist)
return (VObject*)list->At(n);
if (n == 0)
return (VObject*)list;
fprintf(stderr, "CompositeVObject::At: %d out of range\n", n);
}
return 0;
}
int CompositeVObject::Size()
{
if (list) {
if (islist)
return list->Size();
return 1;
}
return 0;
}
void CompositeVObject::Add(VObject *vop)
{
if (vop) {
if (list == 0) {
list= (OrdCollection*) vop;
islist= FALSE;
} else {
if (!islist) {
Object *tmp= list;
list= new OrdCollection;
list->Add(tmp);
islist= TRUE;
}
list->Add(vop);
}
vop->SetContainer(this);
if (IsOpen()) {
vop->Open();
/*
ForceRedraw();
Point e= GetMinSize().extent;
Point ee= GetExtent();
if (e.x > ee.x || e.y > ee.y)
ExtentChanged(this);
else {
SetExtent(GetExtent());
SetOrigin(GetOrigin());
}
*/
}
}
}
VObject *CompositeVObject::Remove(VObject *vop)
{
if (list) {
VObject *old= 0;
if (vop && vop->IsOpen()) {
vop->Close();
vop->ClearContainer(this);
}
if (islist) {
old= (VObject*) list->RemovePtr(vop);
} else {
islist= FALSE;
if (vop == (VObject*) list) {
list= 0;
old= vop;
}
}
if (IsOpen()) {
ForceRedraw();
Point e= GetMinSize().extent;
Point ee= GetExtent();
if (e.x > ee.x || e.y > ee.y)
ExtentChanged(this);
else {
SetExtent(GetExtent());
SetOrigin(GetOrigin());
}
}
return old;
}
return 0;
}
VObject *CompositeVObject::SetAt(int at, VObject *vop)
{
VObject *old= 0;
if (vop && at < Size()) {
if (list == 0) {
list= new OrdCollection;
islist= TRUE;
} else {
if (islist)
;
else {
Object *tmp= list;
list= new OrdCollection;
list->Add(tmp);
islist= TRUE;
}
}
if (at >= 0) {
old= At(at);
if (old) {
if (old->IsOpen())
old->Close();
old->ClearContainer(this);
}
list->PutAt(vop, at);
} else {
list->AddFirst(vop);
}
vop->SetContainer(this);
if (IsOpen()) {
vop->Open();
ForceRedraw();
Point e= GetMinSize().extent;
Point ee= GetExtent();
if (e.x > ee.x || e.y > ee.y)
ExtentChanged(this);
else {
SetExtent(GetExtent());
SetOrigin(GetOrigin());
}
}
}
return old;
}
Iterator *CompositeVObject::MakeIterator(bool forward)
{
if (list) {
if (islist) {
if (forward)
return list->MakeIterator();
return list->MakeReversedIterator();
}
return new Iterator1(list);
}
return new Iterator0;
}
void CompositeVObject::DoObserve(int, int part, void*, Object *op)
{
if (op == list && part == cPartSenderDied)
list= 0;
}
SeqCollection *CompositeVObject::GetList()
{
if (!islist) {
Object *tmp= list;
list= new OrdCollection;
list->Add(tmp);
islist= TRUE;
}
return list;
}
void CompositeVObject::SetItems(va_list ap)
{
register VObject *op;
while (op= va_arg(ap, VObject*))
Add(op);
}
void CompositeVObject::SetItems(VObject *vop, va_list ap)
{
register VObject *op;
if (vop)
Add(vop);
while (op= va_arg(ap, VObject*))
Add(op);
}
void CompositeVObject::SetOrigin(Point origin)
{
VObject::SetOrigin(origin);
Iter next(MakeIterator());
register VObject *vop;
while (vop= (VObject*) next())
vop->SetOrigin(origin);
}
void CompositeVObject::SetExtent(Point extent)
{
VObject::SetExtent(extent);
Iter next(MakeIterator());
register VObject *vop;
while (vop= (VObject*) next())
vop->CalcExtent();
}
OStream& CompositeVObject::PrintOn(OStream &s)
{
VObject::PrintOn(s);
return s << list SP;
}
IStream& CompositeVObject::ReadFrom(IStream &s)
{
Object *op;
VObject::ReadFrom(s);
list= 0;
islist= FALSE;
s >> op;
if (op) {
if (op->IsKindOf(OrdCollection))
islist= TRUE;
list= (OrdCollection*) op;
}
Iter next(MakeIterator());
VObject *vop;
while (vop= (VObject*)next())
vop->SetContainer(this);
return s;
}